import type { Rule } from 'ant-design-vue/es/form';
import { message } from 'ant-design-vue';

/**
 * 图片上传前的校验
 * @param img 使用upload组件上传的图片file文件
 * @param size 规定的图片体积大小
 * @returns 返回true 或 false 的校验结果
 */
export const CheckImg = (img: any, size = 10): boolean => {
	const defaultTypes = ['jpeg', 'jpg', 'png', 'bmp'];
	const currentType = [...img.name.split('.')].splice(-1)[0];
	if (!defaultTypes.includes(currentType)) {
		message.error(`请上传${defaultTypes.join('、')}格式的图片`);
		return false;
	}
	if (img.size / 1024 / 1024 > size) {
		message.error(`$图片尺寸最大不能超过${size}MB`);
		return false;
	}
	return true;
};

/**
 * 校验密码的方法和正则
 * $CheckPassword >> 正则
 * $CheckPassword >> 检验函数
 */
type TsExpandAttr = {
	remark: string;
	// 当前的校验是否为二次的校验
	again?: boolean;
	// 第一遍输入的密码值
	prevVal?: string;
};
export const CheckPassword = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9a-zA-Z]{6,20}$/;
export const VerifyPassword = async (rule: Rule, value: string, expand: TsExpandAttr): Promise<any> => {
	if (!value) {
		return Promise.reject(expand.remark);
	}
	const reg = CheckPassword;
	if (!reg.test(value)) {
		return Promise.reject('密码长度为6~20位, 必须包含数字和字母');
	}
	if (expand.again) {
		if (expand.prevVal && expand.prevVal !== value) {
			return Promise.reject('两次输入的密码不一致');
		}
	}
	return Promise.resolve();
};

/**
 * Form表单整体校验, 检验通过后执行传入的callback回调函数
 * -
 * @param formRef 类型: ref实例 — 表单的ref实例
 * -
 * @param callback 类型: Function — 校验成功后的回调函数
 */
export const VerifyForm = (formRef: Ref, callback: Function): void => {
	formRef.value
		.validate()
		.then(() => {
			callback && callback();
		})
		.catch((error: any) => {
			console.log('表单提交验证错误', error);
		});
};

/**
 * 校验手机号码
 * -
 * @param rule 类型: Rule — antd的表单Rule
 * -
 * @param value 类型: string — 需要校验的参数
 * -
 * @返回 类型: boolean — 校验结果
 */
function VerifyPhone(rule: any, value: string | number) {
	const copyValue = value ? value.toString() : '';
	if (!copyValue) {
		return Promise.reject('请输入手机号');
	}
	const reg = /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/;
	if (!reg.test(copyValue)) {
		return Promise.reject('手机号格式错误');
	}
	return Promise.resolve();
}

export { VerifyPhone };
/**
 * Form表单整体校验, 检验通过后执行传入的callback回调函数
 * -
 * @param formRef 类型: ref实例 — 表单的ref实例
 * -
 * @param callback 类型: Function — 校验成功后的回调函数
 */

// 验证固件升级包符合以v1.0.0结尾的版本号正则
export const versionHardWareReg = /v(\d+\.\d+\.\d+)/;

// 验证软件升级包符合以glasssix-edgebox-1.0.0开头的版本号正则
export const versionSoftWareReg = /^glasssix-edgebox-\d+\.\d+\.\d+/;

/**
 * 验证分辨率
 * @param file
 * @param dpi [number, number] | [[number, number], [number, number]] 分辨率
 * @param isRatio 是否等比
 * @returns Promise 1:通过 -1:不满足最小分配率 -2: 满足最小分辨率但不符合等比分辨率 -3:超过最大分配率
 */
export type dpiType = number[][] | [number, number] | [[number, number], [number, number]];

export const isDpi = (file: any, dpi: dpiType, isRatio = false): any => {
	// eslint-disable-next-line promise/avoid-new
	return new Promise(function (resolve, reject) {
		const _URL = window.URL || window.webkitURL;
		const image = new Image();
		image.onload = function () {
			let result: number = 1;
			if (typeof dpi[0] === 'number') {
				const [width, height] = dpi as [number, number];
				const w_ratio = image.width / width;
				const h_ratio = image.height / height;
				if (isRatio) {
					w_ratio >= 1 && h_ratio >= 1 && w_ratio === h_ratio ? (result = 1) : (result = -2);
				} else {
					w_ratio >= 1 && h_ratio >= 1 ? (result = 1) : (result = -1);
				}
			} else {
				const [[width1, height1], [width2, height2]] = dpi as [[number, number], [number, number]];
				const w = image.width;
				const h = image.height;
				const w_ratio = w / width1;
				const h_ratio = h / height1;

				if (w_ratio >= 1 && h_ratio >= 1) {
					if (isRatio) {
						w_ratio === h_ratio ? (result = 1) : (result = -2);
					} else {
						w <= width2 && h <= height2 ? (result = 1) : (result = -3);
					}
				} else {
					result = -1;
				}
			}

			result === 1 ? resolve(result) : reject(result);
		};
		image.src = _URL.createObjectURL(file);
	});
};

export const fileNameReg = /^[^_]+_[^\\.]+\\.\\w+$/;
// 支持字母和数字
export const numberAndLetterReg = /^[A-Za-z0-9]+$/;

// 支持汉字和数字和字母
export const chineseAndNumberAndLetterReg = /^[\u4e00-\u9fa5_a-zA-Z0-9]+$/;

// IP地址正则 如0.0.0.0，其中，每个数字的范围为0-255。
export const ipReg = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;

// IP默认网关正则 如0.0.0.0，其中，每个数字的范围为0-255。
export const gatewayReg = /^(\d{1,3}\.){3}\d{1,3}$/;

// dns正则 如0.0.0.0，其中，每个数字的范围为0-255。
export const dnsNameRegex = /^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\.)+[a-zA-Z]{2,}$/;

// IP子网掩码正则 如0.0.0.0，其中，每个数字的范围为0-255。
export const cidrReg =
	/^((128|192|224|240|248|252|254)\.0\.0\.0)|(^255\.(0|128|192|224|240|248|252|254)\.0\.0)|(^255\.255\.(0|128|192|224|240|248|252|254)\.0)|(^255\.255\.255\.(0|128|192|224|240|248|252|254))$/;
